fix: stop filing Anvil applications under "AI Agents", rename them "responsive" - #42219
Conversation
…esponsive"
Two user-facing problems on the workspace applications screen.
1. ANVIL-layout applications were shown under a heading reading "AI Agents".
ApplicationsSection renders a single anvilApplications card list whose
title was picked by a ternary:
title={createMessage(
isAiAgentFlowEnabled ? AI_AGENTS_APPLICATIONS : ANVIL_APPLICATIONS,
)}
With license_ai_agent_enabled on, every ANVIL application was filed under
a heading calling it an AI agent. They are not AI agents — they are
ANVIL-layout applications that happen to share the list. The
emptyStateMessage directly above used the same ternary.
Both ternaries are removed. The heading and the empty state are now
unconditional, so the list is named for what it contains.
2. The user-facing name for the ANVIL layout system becomes "responsive".
ANVIL_APPLICATIONS Anvil apps -> Responsive applications
NEW_ANVIL_APP Anvil app -> Responsive application
ANVIL_APPLICATION_CARD_LIST_ZERO_STATE -> "There are no responsive
applications in this
workspace."
Sentence case, and "applications" rather than "apps", to match every
sibling rendered on the same screen — APPLICATIONS, NEW_APP and
APPLICATION_CARD_LIST_ZERO_STATE. "responsive" stays lowercase
mid-sentence because it is a descriptor, not a brand name. (FIXED_APPLICATIONS,
"Classic Applications", is dead code and never renders, so it is not the
title-cased counterweight it appears to be.)
The INTERNAL name stays "Anvil" everywhere: the persisted
appPositioning.type == ANVIL enum, LayoutSystemTypes.ANVIL, the feature
flags, module paths and every data-testid are untouched. Renaming the
persisted enum would require a migration and would silently un-gate every
existing Anvil application, since the paid-entitlement gate keys on that
literal value.
Test: adds ApplicationsSection.test.tsx, which renders ApplicationsSection
with getIsAiAgentFlowEnabled forced true — the state that produced the bug.
It deliberately does NOT test ApplicationCardList, which forwards `title`
verbatim to CardList and would therefore pass both before and after the fix.
Verified red against pre-fix source, failing with the DOM rendering
"AI Agents" and "There are no AI Agents in this workspace.". Reverting only
the ternary while leaving the string rename applied isolates the mis-filing
decision from the rename.
Known, deliberately not fixed here: the render gate on that block is wrong.
isAnvilEnabled resolves through getIsAnvilLayoutEnabled, which reads the
RETIRED release_anvil_enabled flag — never served, so always false in
production. The gate collapses to isAiAgentFlowEnabled alone, so an
organization licensed for Anvil without the AI-agent flag never sees this
section at all and its applications appear in neither list. That is a
behaviour change needing its own test and is tracked separately.
APP-15954
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RH3iMFoeZY87CCNSWLfCh6
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (3)
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review. WalkthroughThe application list now uses “Responsive” labels for Anvil applications. It always renders Anvil headings and empty-state text. Regression tests cover populated and empty Anvil application lists with the AI-agent flow enabled. ChangesResponsive application labels
Estimated code review effort: 2 (Simple) | ~10 minutes Suggested reviewers: Merge Risk: ⚪ Minimal · up to The Applications screen now consistently uses Responsive terminology for ANVIL applications, with focused coverage for populated and empty states. No concrete merge-blocking production risk is identified. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Responsive labels line up in a row Comment |
Description
Two user-facing problems on the workspace applications screen.
1. ANVIL applications were filed under an "AI Agents" heading.
ApplicationsSectionrenders a singleanvilApplicationscard list whose title was picked by a ternary:With
license_ai_agent_enabledon, every ANVIL application was filed under a heading calling it an AI agent. They are not AI agents — they are ANVIL-layout applications that happen to share the list. TheemptyStateMessagedirectly above used the same ternary. Both are removed; the heading and empty state are now unconditional.2. The user-facing name for the ANVIL layout system becomes "responsive".
ANVIL_APPLICATIONSAnvil appsResponsive applicationsNEW_ANVIL_APPAnvil appResponsive applicationANVIL_APPLICATION_CARD_LIST_ZERO_STATEThere are no Anvil apps in this workspace yet.There are no responsive applications in this workspace.Sentence case and "applications" rather than "apps", to match every sibling rendered on the same screen —
APPLICATIONS,NEW_APP,APPLICATION_CARD_LIST_ZERO_STATE. "responsive" stays lowercase mid-sentence because it is a descriptor, not a brand name.Note
FIXED_APPLICATIONS("Classic Applications") is dead code — defined but referenced nowhere — so it is not the title-cased counterweight it appears to be. The headings that actually render are "Applications", this one, "Packages" and "Workflows".Fixes https://linear.app/appsmith/issue/APP-15954
Scope — user-facing strings only
The internal name stays "Anvil" everywhere: the persisted
appPositioning.type == ANVILenum,LayoutSystemTypes.ANVIL, the feature flags, module paths and everydata-testid. Renaming the persisted enum would require a migration and would silently un-gate every existing Anvil application, since the paid-entitlement gate keys on that literal value.Testing
Adds
ce/pages/Applications/tests/ApplicationsSection.test.tsx— two tests, both verified red against pre-fix source:with the printed DOM showing the heading as
AI Agentsand the zero state asThere are no AI Agents in this workspace.It renders
ApplicationsSectiondeliberately, notApplicationCardList— that component forwardstitleverbatim toCardList, so a test there would prove only "the component renders the title it was handed" and would pass both before and after the fix. The decision being fixed lives inApplicationsSection.Reverting only the ternary while leaving the string rename applied isolates the mis-filing decision from the rename.
Known issue, deliberately not fixed here
The render gate on that block is wrong, and this PR does not change it.
isAnvilEnabledresolves throughgetIsAnvilLayoutEnabled, which reads the retiredrelease_anvil_enabledflag — no longer in the server'sFeatureFlagEnum, so never served, and defaulted tofalse. The gate therefore collapses toisAiAgentFlowEnabledalone.Consequence: an organization licensed for Anvil without the AI-agent flag never renders this section at all, and because
anvilApplicationsis partitioned out ofnonAnvilApplications, its applications appear in neither list. That is pre-existing, is a behaviour change to fix, and needs its own test — so it is tracked separately rather than folded in here.getIsAnvilLayoutEnabled's JSDoc also claims it is@deprecated DEAD / RETIRED (M5)with "ZERO production callers", which is false —ApplicationsSectionis a live caller. Worth correcting alongside that fix.Impact on existing instances
Label-only. No schema change, no migration, no persisted-data change, no flag change. Existing applications are unaffected functionally; ANVIL ones move from an "AI Agents" heading to "Responsive applications". Rollback is a revert.
Companion EE change (removing the unused AI Agent create-menu item, and renaming the EE license-gate copy and instance-setting label) ships separately in
appsmith-eeand depends on this landing first, since the create-menu label lives in this file.Automation
/ok-to-test tags="@tag.All"
Tip
🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
Workflow run: https://github.com/appsmithorg/appsmith/actions/runs/34511756341
Commit: 9212b47
Cypress dashboard.
Tags:
@tag.AllSpec:
Thu, 10 Sep 2026 19:07:42 UTC
Summary by CodeRabbit